package iface.aplicativo.negocio.aps;

import iface.aplicativo.excecao.MensagemException;
import iface.aplicativo.integracao.dao.FormaPagamentoDAO;
import iface.aplicativo.negocio.entidade.FormaPagamento;
import iface.aplicativo.util.Constantes;
import iface.aplicativo.util.MontarObjeto;
import iface.aplicativo.util.ResourceMessageFactory;
import iface.aplicativo.util.UtilResource;
import iface.arquitetura.comum.string.UtilString;
import iface.arquitetura.utilitario.ResourceMessageAnnotation;

import java.util.Collection;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional(readOnly = true, rollbackFor = { Exception.class })
public class ManterFormasPagamentoAPS {

	@ResourceMessageAnnotation(propertiesFile = { Constantes.RECURSO_MENSAGENS })
	private UtilResource resource = ResourceMessageFactory.inicialize(this);

	@Resource
	FormaPagamentoDAO formaPagamentoDAO;

	protected FormaPagamentoDAO getFormaPagamentoDAO() {
		if (this.formaPagamentoDAO == null) {
			this.formaPagamentoDAO = (FormaPagamentoDAO) MontarObjeto
					.getNewInstance(FormaPagamentoDAO.class);
		}
		return this.formaPagamentoDAO;
	}

	@Transactional(propagation = Propagation.REQUIRED)
	public String salvarFormaPagamento(FormaPagamento entidade)
			throws Exception {

		this.validarCamposFormaPagamento(entidade);
		this.validarExistencia(entidade);

		if (entidade.getId() == null) {
			this.getFormaPagamentoDAO().inserir(entidade);
			return this.resource.getMensagens("MSG01");
		} else {
			this.getFormaPagamentoDAO().alterar(entidade);
			return this.resource.getMensagens("MSG02");
		}

	}

	@Transactional(propagation = Propagation.REQUIRED)
	public String excluirFormaPagamento(FormaPagamento entidade)
			throws Exception {
		try {
			this.getFormaPagamentoDAO().remover(entidade);
		} catch (Exception ex) {
			throw new Exception(ex);
		}
		return this.resource.getMensagens("MSG03");
	}

	public void validarCamposFormaPagamento(FormaPagamento entidade)
			throws Exception {
		this.resource.clearMensagens();

		if (entidade != null) {
			if (UtilString.isVazio(entidade.getDescricao())) {
				this.resource.addMensagens("MSG05", "Forma de pagamento");
			}
		}

		if (this.resource.isMensagens()) {
			throw new MensagemException(this.resource.getMensagens());
		}
	}

	public void validarExistencia(FormaPagamento entidade) throws Exception {
		this.resource.clearMensagens();

		FormaPagamento formaPagamentoConsulta = this.getFormaPagamentoDAO()
				.consultarPorFormaPagamento(entidade);

		if (formaPagamentoConsulta != null) {
			this.getFormaPagamentoDAO().getHibernateTemplate().clear();
			if (entidade.getId() != null) {
				if (!formaPagamentoConsulta.getId().equals(entidade.getId())) {
					this.resource.addMensagens("MSG19");
				}
			} else {
				this.resource.addMensagens("MSG19");
			}
		}

		if (this.resource.isMensagens()) {
			throw new MensagemException(this.resource.getMensagens());
		}
	}

	public FormaPagamento consultarPorFormaPagamento(String descricao)
			throws Exception {
		FormaPagamento entidade = null;
		try {
			entidade = this.getFormaPagamentoDAO().obter(descricao);
		} catch (Exception ex) {
			throw new Exception(ex);
		}
		return entidade;
	}

	public FormaPagamento consultarFormaPagamentoPorId(Long id)
			throws Exception {
		FormaPagamento entidade = null;
		try {
			entidade = this.getFormaPagamentoDAO().obter(id);
		} catch (Exception ex) {
			throw new Exception(ex);
		}
		return entidade;
	}

	public Collection<FormaPagamento> consultarTodosFormaPagamento() {
		return this.getFormaPagamentoDAO().consultar();
	}

}
